package Middlewares

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"strings"
	"yz-go/Common"
	"yz-go/Logic"
)

// 自定义中间件
func JWTAuthMiddleware() func(c *gin.Context) {
	return func(c *gin.Context) {
		// 客户端携带Token有三种方式 1.放在请求头 2.放在请求体 3.放在URI
		// 这里假设Token放在Header的Authorization中，并使用Bearer开头
		// 这里的具体实现方式要依据你的实际业务情况决定

		// PostForm 只能接收到 Body 的json字符串
		//authHeader := c.PostForm("Authorization")

		// PostForm 只能接收到 Body 的json字符串
		//{
		//	ap:"ap"
		//}
		//hd := c.PostForm("ap")

		// 获取request.header参数
		authHeader := c.Request.Header.Get("Authorization")

		if authHeader == "" {
			c.JSON(http.StatusOK, gin.H{
				"code": Common.ERROR,
				"msg":  "请求头中auth为空",
			})
			c.Abort()
			return
		}

		// 按空格分割
		parts := strings.SplitN(authHeader, " ", 2)
		if !(len(parts) == 2 && parts[0] == "Bearer") {
			c.JSON(http.StatusOK, gin.H{
				"code": Common.ERROR,
				"msg":  "请求头中auth格式有误",
			})
			c.Abort()
			return
		}

		// parts[1]是获取到的tokenString，我们使用之前定义好的解析JWT的函数来解析它
		//var mc = &Logic.MyClaims{}
		mc, err := Logic.ParseToken(parts[1])
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"code": Common.ERROR,
				"msg":  "无效的Token",
			})
			c.Abort()
			return
		}

		// mc 相当于保存了 加密时候的节后体 解析出来的就相当于 MyClaims的所有信息
		//type MyClaims struct {
		//	Id       int    `json:"id"`
		//	Username string `json:"username"`
		//	Password string `json:"password"`
		//	jwt.StandardClaims
		//}
		fmt.Printf("用户ID：%d,	密码：%v,	用户名：%v\n", mc.Id, mc.Password, mc.Username)

		// StandardClaims 直接获取 MyClaims 结构体下的 jwt.StandardClaims的信息，这里就无需带上jwt了
		fmt.Println("-----------返回结构体内 StandardClaims 信息-----------")
		fmt.Println(mc.StandardClaims)
		fmt.Println(mc.StandardClaims.ExpiresAt)
		fmt.Println(mc.StandardClaims.Issuer)
		fmt.Println("--------------------------")

		// 将当前请求的username信息保存到请求的上下文c上
		c.Set("id", mc.Id)
		c.Set("username", mc.Username)

		c.Next() // 后续的处理函数可以用过c.Get("username")来获取当前请求的用户信息
	}
}
